package com.review.Demo_14_Future模式;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;


/**
 * 就是为表明线程提交处理后，future对象是立即返回的，紧接着“Ready”马上就打印“Give the future”了；
 * 而当调用future.get的时候就停下了，“Get the future”迟迟没有打印，被阻塞了，直到线程执行完毕为止。
 * 这里我让他睡了3秒钟，能看得更清楚。
 * 
 * 
 * future模式，在没有获取真实数据之前并没有影响主线程的继续执行提高了主线程的效率
 *
 *
 */
public class FutureTest {  
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception {  
		ExecutorService executor = Executors.newCachedThreadPool();  
		System.out.println("Ready");  
		//其实返回的Future时空壳，并没有真实的数据
		
		//若不用futureTask包装，则submit返回的结果---Future.get()是执行的结果
		Future strFuture = executor.submit(new TaskTest());//线程没有在此处等待，说明用了future设计模式  ----交给另一个线程去执行了
		System.out.println("Give the future");  
		System.out.println("Get the future : " + strFuture.get());//future.get()方法才是调用真实的数据
		System.out.println("End");  
		executor.shutdown();  
		
		
		//若用futureTask包装，则submit返回的结---果Future.get()是null；futureTask.get()放回的是执行的结果
//		FutureTask<String> futureTask = new FutureTask<String>(new TaskTest());
//		
		//证明execute也是异步的----但是获取不到最终的执行结果
//		executor.execute(futureTask);
//		System.out.println("1111");
		
//		Future submit = executor.submit(futureTask);
//		Object object = submit.get();
//		System.out.println("Future:"+object);
//		String string = futureTask.get();
//		System.out.println("FutureTask:"+string);
		
	}  

	public static class TaskTest implements Callable {  
		@Override  
		public String call() throws Exception {  
			Thread.sleep(3000);  
			System.out.println("22222");
			return "Hello World!";
		}  
	}  
}  
